package com.powernode.config;

import com.powernode.constant.Constants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类，用于定义订单相关的消息队列、交换机及绑定关系
 * 采用Direct Exchange（直接交换机）模式，根据路由键精确匹配消息路由
 */
@Configuration
public class RabbitConfig {
    /**
     * 定义订单直接交换机
     * Direct Exchange特点：消息中的路由键(routing key)如果和 Binding 中的 binding key 一致，
     * 交换器就将消息发到对应的队列中，是完全匹配、单播的模式
     * @return DirectExchange实例，使用常量类中定义的交换机名称Constants.EXCHANGE_NAME_ORDER
     */
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(Constants.EXCHANGE_NAME_ORDER);
    }

    /**
     * 定义订单消息队列
     * 队列是消息的载体，每个消息都会被投入到一个或多个队列
     * @return Queue实例，使用常量类中定义的队列名称Constants.QUEUE_NAME_ORDER
     */
    @Bean
    public Queue queue() {
        return new Queue(Constants.QUEUE_NAME_ORDER);
    }

    /**
     * 绑定交换机与队列的关系
     * 通过指定的路由键将交换机和队列进行绑定，使消息能够从交换机路由到队列
     * @return Binding实例，建立directExchange交换机与queue队列的绑定关系
     */
    @Bean
    public Binding binding() {
        // 使用BindingBuilder将队列绑定到交换机，并指定路由键Constants.ROUTING_KEY_ORDER
        return BindingBuilder.bind(queue()).to(directExchange()).with(Constants.ROUTING_KEY_ORDER);
    }
}